package org.dromara.common.encrypt.core.encryptor;

import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：AES算法实现
 */
public class AesEncryptor extends AbstractEncryptor {

    /**
     * 加密上下文 用于encryptor传递必要的参数。
     */
    private final EncryptContext context;

    public AesEncryptor(EncryptContext context) {
        super(context);
        this.context = context;
    }

    /**
     * 获得当前算法
     */
    @Override
    public AlgorithmType algorithm() {
        return AlgorithmType.AES;
    }

    /**
     * 加密
     * 根据指定的编码类型对值进行加密
     * 此方法使用AES加密算法，根据传入的编码类型（HEX或其他），选择不同的加密方式
     * 如果编码类型是HEX，则返回十六进制加密结果；否则返回非十六进制加密结果
     *
     * @param value      待加密字符串
     * @param encodeType 加密后的编码格式，决定了使用哪种加密方式
     * @return 加密后的字符串
     */
    @Override
    public String encrypt(String value, EncodeType encodeType) {
        // 当编码类型为HEX时，使用AES算法将输入值加密为十六进制格式
        if (encodeType == EncodeType.HEX) {
            return EncryptUtils.encryptByAesHex(value, context.getPassword());
        } else {
            // 当编码类型不是HEX时，使用AES算法将输入值以标准格式加密
            return EncryptUtils.encryptByAes(value, context.getPassword());
        }
    }

    /**
     * 解密
     *
     * 使用AES算法解密指定的字符串
     * 此方法通过调用EncryptUtils类的decryptByAes方法来实现解密功能
     * 它使用当前上下文（context）中存储的密码进行解密操作
     *
     * @param value 待解密的字符串，该字符串应该是通过对应的加密方法加密得到的
     * @return 解密后的原始字符串
     */
    @Override
    public String decrypt(String value) {
        // 调用EncryptUtils工具类的decryptByAes方法，使用上下文中的密码进行解密
        return EncryptUtils.decryptByAes(value, context.getPassword());
    }
}
